<?php
/**
 * 系統名稱: Lotto 系統
 * 檔案說明: 專案管理-修改
 * $Author$
 * $Id$
 *
 */
if (!defined("UserSession_lib_include")){
    define("UserSession_lib_include", 1);

/**
 * 重複連結主DB
 * @return	不回傳 void
 */
	function ReConnectSessionDB(){
		$arrErr = DBConnection("Master");
		if(sizeof($arrErr) > 0){
			$GLOBALS["errormessage"] = $arrErr["Subject"];
			$GLOBALS["errorhidden"] = "\nError: ".$arrErr["Content"].",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}
		return true;
	}

/**
 * 取得會員可以停留在網站時間
 * @return	回傳 int
 */
	function UserSession_iniLoginTime(){
		global $_KSysParam;
		return (empty($_KSysParam[MemberLoginTime]))?1800:($_KSysParam[MemberLoginTime]+0);
	}

/**
 * 紀錄一筆 Sessions
 * @param	strSessionID PHP 的 Session ID
 * @param	intMemID 使用者序號
 * @param	intGroup 使用者群組序號
 * @param	intSubID 代理商序號
 * @param	intMainID 總代理序號
 * @param	intStockID 股東序號
 * @param	intDirectorID 總監序號
 * @return	回傳 現在時間
 */
	function UserSession_Start($strSessionID, $intMemID, $intGroup, $intSubID = 0, $intMainID = 0, $intStockID = 0, $intDirectorID = 0){
		global $_ConnMaster;
		if(!$_ConnMaster)if(!ReConnectSessionDB())return false;

		$intLoginTime = UserSession_iniLoginTime();
		$intStartTime = time();
		$intLoginTime += $intStartTime;

		$strSQL = "insert into `bet_Sessions`(`SessionID`,`MemID`,`MemGroup`,`IP`,`StartTime`,`UseTime`,`SubID`,`MainID`,`StockID`,`DirectorID`) values('".$strSessionID."',".$intMemID.",".$intGroup.",'".$_SERVER["REMOTE_ADDR"]."',".$intStartTime.",".$intLoginTime.",".$intSubID.",".$intMainID.",".$intStockID.",".$intDirectorID.")";

		if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Session Error!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}

		if($intGroup == 1){
			$_SESSION["Member_Info"] -> LoginTime = $intLoginTime;
		}else{
			$_SESSION["Admin_Info"] -> LoginTime = $intLoginTime;
		}
		return $intStartTime;
	}  //  UserSession_Start()  //


/**
 * 更新使用者 Session 登入時間
 * @param	strSessionID PHP 的 Session ID
 * @param	intMemID 使用者序號
 * @param	intGroup 使用者群組序號
 * @return	不回傳 void
 */
	function UserSession_ReStart($strSessionID, $intMemID, $intGroup, $intSID = 0){
		global $_ConnMaster, $_AdminIndex, $_MemberIndex;
		if(!$_ConnMaster)if(!ReConnectSessionDB())return false;

		$intLoginTime = UserSession_iniLoginTime();
		mt_srand((double)microtime()*100000000);
		$intLoginTime += time();
		$intRandNo = mt_rand(0, 999999999);

		//再將使用者登入將延長
		$strSQL = "update `bet_Sessions` set UseTime = ".$intLoginTime.", RandNo = FLOOR(".$intRandNo." + RAND()*10000) where SessionID = '".$strSessionID."' and MemID = ".$intMemID." and isEnd = 0 ";
		if(!empty($intSID))$strSQL .= " and StartTime = '".(string)$intSID."'";

		if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Session Error!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}

		//找不到 Session 紀錄，回到首頁
		if(mysql_affected_rows($_ConnMaster) == 0){
			//exit($strSQL);
			return false;
		}

		if($intGroup == 1){
			$_SESSION["Member_Info"] -> LoginTime = $intLoginTime;
		}else{
			$_SESSION["Admin_Info"] -> LoginTime = $intLoginTime;
		}
		return true;
	}  //   UserSession_ReStart()  //


/**
 * 停止使用者在網站使用權力
 * @param	strSessionID Session ID
 * @param	intMemID 使用者序號
 * @return	錯誤時不傳回void 程式終止，正確傳回 true
 */
	function UserSession_End($strSessionID, $intMemID){
		global $_ConnMaster, $_KSysParam;
		if(!$_ConnMaster)if(!ReConnectSessionDB())return false;

		//指定登出使用者或已過時者
		$intMemberLoginTime = UserSession_iniLoginTime();
		$strSQL = "update `bet_Sessions` set isEnd = 1 where (SessionID = '".$strSessionID."' and MemID = ".(string)$intMemID.") or (UseTime < (".(string)(time() - $intMemberLoginTime)."))";
		if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Session Error!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}
		return true;
	}


/**
 * 依使用者序號，清除所有 Session 紀錄
 * @param	strMemID 使用者序號字串，ex: '1,3,4,..,n'
 * @return	錯誤時傳回false 程式終止，正確傳回 true
 */
	function UserSession_getOut($strMemID){
		global $_ConnMaster;
		if(!$_ConnMaster)if(!ReConnectSessionDB())return false;

		$strSQL = "delete from `bet_Sessions` where MemID in (".$strMemID.")";
		if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Kick out user error!!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}
		return true;
	}

/**
 * 依使用者群組，清除所有 Session 紀錄
 * @param	strMemID 使用者序號字串，ex: '1,3,4,..,n'
 * @return	錯誤時傳回false 程式終止，正確傳回 true
 */
	function UserSession_getOutByGroup($strGroup){
		global $_ConnMaster;
		if(!$_ConnMaster)ReConnectSessionDB();
		$strSQL = "delete from `bet_Sessions` where MemGroup in (".$strGroup.")";

		if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Kick out group error!!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}
		return true;
	}

/**
 * 清除停止登入紀錄，並最佳化資料庫
 * @param	strMemID 使用者序號字串，ex: '1,3,4,..,n'
 * @return	錯誤時不傳回void 程式終止，正確傳回 true
 */
	function UserSession_Clear(){
		global $_ConnMaster;
		if(!$_ConnMaster)if(!ReConnectSessionDB())return false;

		$strSQL = "delete from `bet_Sessions` where isEnd = 1";
		if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Session Error!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}
		$strSQL = "OPTIMIZE TABLE `bet_Sessions`";
		if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Session Error!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}
		return true;
	}


/**
 * 停止使用者在網站使用權力
 * 系統參數
 * _KSysParam[isLimitMemberLogin]：是否只限制會員單一IP登入！
 * _KSysParam[isLimitMemberWinLogin]：是否只限制會員單一 Session 登入！
 * _KSysParam[isLimitManagerLogin]：是否只限制管理人員單一IP登入！
 * _KSysParam[isLimitManagerWinLogin]：是否只限制管理人員單一 Session 登入！
 * @param	strSessionID Session ID
 * @param	intMemID 使用者序號
 * @param	intGroup 群組序號
 * @return	存在時傳回 true，不存在或錯誤傳回 true
 */
	function UserSessions_Exist($strSessionID, $intMemID, $intGroup){
		global $_ConnMaster, $_KSysParam;

		if($intGroup == 1){	//會員
			if($_KSysParam[isLimitMemberLogin] == 0)return false;
			$isOnlyUser = $_KSysParam[isLimitMemberLogin];
			$isOnlyUserWaitTime = $_KSysParam[isLimitMemberLoginWaitTime];
		}elseif($intGroup == 31){  //系統管理者
			return false;
		}else{
			if($_KSysParam[isLimitManagerLogin] == 0)return false;
			$isOnlyUser = $_KSysParam[isLimitManagerLogin];
			$isOnlyUserWaitTime = $_KSysParam[isLimitManagerLoginWaitTime];
		}

		//找出使用者是否在線
		$strSQL = "select MemID, WaitTime from `bet_Sessions` where isEnd =0 and MemID = ".$intMemID." order by WaitTime desc limit 0,1";
		if(!$RS = @PMA_mysql_query($strSQL, $_ConnMaster)){
			$GLOBALS["errormessage"] = "Session Error!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($$_Conn)."\nSQL:".$strSQL.",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return true;
		}

		//若使用者在線
		if(PMA_mysql_num_rows($RS) > 0){
			$Rows = @PMA_mysql_fetch_object($RS);
			@mysql_free_result($RS);
			//若使用者在線，且沒有其他使用者等待，標記預定等待時間
			if($Rows -> WaitTime == 0){
				$strSQL = "update `bet_Sessions` set WaitTime = ".(string)($isOnlyUserWaitTime + time())." where isEnd =0 and MemID = ".$intMemID;
				if(!@PMA_mysql_query($strSQL, $_ConnMaster)){
					$GLOBALS["errormessage"] = "Session Error!";
					$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($_ConnMaster).",\nLinue:".__LINE__.",\nPage:".__FILE__;
					return true;
				}
				if($intGroup == 1){
					$_SESSION["Member_Info"] -> ExistUserCheckTime = $isOnlyUserWaitTime + time() - 5;
				}else{
					$_SESSION["Admin_Info"] -> ExistUserCheckTime = $isOnlyUserWaitTime + time() - 5;
				}
			//若使用者在線，且有其他使用者等待超過預定時間，踢出在線使用者
			}elseif($Rows -> WaitTime < time()){
				UserSession_getOut((string)$intMemID);
				return false;
			}  //if($Rows -> WaitTime == 0)
			return true;
		}  //if(PMA_mysql_num_rows($RS) > 0)
		//無使用者在線
		@mysql_free_result($RS);
		return false;
	} //  UserSessions_Exist()  //

/**
 * 取得群組使用者數量
 * @param	intGroup 群組序號
 * @return	錯誤時傳回 false，正確傳回數量 int
 */
	function getGroupUserNo($intGroup){
		global $_Conn, $$_Conn;
		$strSQL = "select COUNT( DISTINCT MemID ) as UserNo from `bet_Sessions` where isEnd =0 AND MemGroup =".$intGroup;

		$intAdminID = $_SESSION["Admin_Info"] -> ID;
		switch($_SESSION["Admin_Info"] -> MemberGroup){
			case 11:
				$intAdminID = $_SESSION["Admin_Info"] -> ParentID;
			case 2:
				$strSQL .= " and SubID = ".$intAdminID;
				break;

			case 12:
				$intAdminID = $_SESSION["Admin_Info"] -> ParentID;
			case 3:
				$strSQL .= " and MainID = ".$intAdminID;
				break;

			case 13:
				$intAdminID = $_SESSION["Admin_Info"] -> ParentID;
			case 4:
				$strSQL .= " and StockID = ".$intAdminID;
				break;

			case 14:
				$intAdminID = $_SESSION["Admin_Info"] -> ParentID;
			case 5:
				$strSQL .= " and DirectorID = ".$intAdminID;
				break;
		}

		if(!$RS = @PMA_mysql_query($strSQL, $$_Conn)){
			$GLOBALS["errormessage"] = "Session Error!";
			$GLOBALS["errorhidden"] = "\nError: ".PMA_mysql_error($$_Conn).",\nLinue:".__LINE__.",\nPage:".__FILE__;
			return false;
		}
		$Row = PMA_mysql_fetch_object($RS);
		return (empty($Row -> UserNo))?0:$Row -> UserNo;
	}

//-------------------------------------------------------//
//UserSessions_lib End
}
?>